/**
 * DJ传奇公用JS
 * @author kevinE kevin-e-e@foxmail.com
 * @version 1.2 2022-1-27 09:57:47
 */

const public = true;

// 后端接口appKey
const APPKEY = "5ded368547b86b331";
// 云片appId
const YP_APPId = "80fe987ccea24085bc07bd8a00587d42";
// 后端请求域
let host = location.host;
let local = ['192.168', '127.0.0'];
const DOMAIN = ~local.indexOf(host) > 0 ? "" : "http://xwrc.cpnet.cc";
// 图片资源服务器
const IMG_DOMAIN = 'http://img.mlyougame.com';
// APP下载服务器
const DOWNLOAD_DOMAIN = "http://download.tnlyipr.cn";
// 二维码短链
const SHORT_URL = DOMAIN + "/qr/";
// cookie前缀
const PREFIX = 'make';
// 登录页面
const LOGIN_PAGE = 'login.html';
// 游戏ID
const GAME_ID = 1508;
// 客服配置
const SERVICE = {
	link: "http://xykmkf.jusheng.us/index/index/home?visiter_id=&visiter_name=&avatar=&business_id=1&groupid=0&special=",
	seat: [1]
};

// 接口地址
const API_PATH = {
	//区服配置
	GETCONFIG: DOMAIN + '/home/index/getConfig',
	// 检查版本信息
	CHECK_VERSION: DOMAIN + "/home/index/checkVersion",
	// 短信验证码接口url
	SMS_CODE: DOMAIN + "/api/user/sendSms",
	// 注册接口路径
	REGISTER: DOMAIN + "/api/user/reg",
	// 登录接口路径
	LOGIN: DOMAIN + "/api/user/login",
	// 找回/重置密码
	RESET_PWD: DOMAIN + "/api/user/resetPwd",
	// 绑定支付宝账号
	BIND_ALIPAY: DOMAIN + "/api/user/bindAli",
	// 获取用户信息接口url
	USER_INFO: DOMAIN + "/api/user/get_user_info",
	// 提现  money,(需要头部传参)， Post
	CASH: DOMAIN + "/api/wallet/apply",
	// 余额明细：page,(需要头部传参)  Get type 1
	MONEY_DETAIL_LIST: DOMAIN + "/api/wallet/list",
	// 获取游戏地址 gid: 游戏ID，id: 用户id
	GET_GAME_LINK: DOMAIN + '/home/index/third_login',

	// 福利 1 新人任务 3 等级奖励
	WELFAREFULI: DOMAIN + '/api/welfare',
	// 福利 新人任务 task_id
	WELFAREFULICOLLECT: DOMAIN + '/api/welfare/collect',
	// 新人攻略上报
	WELFAREREPORT: DOMAIN + '/api/welfare/report',
	// 瓜分灵石
	CARVEUPRANK: DOMAIN + '/api/activity/carve_up_rank',
	// 天骄榜 1:等级榜, 2:坐骑榜, 3:魄力榜, 4 > 战宠榜, 5:宝石榜, 6:战力榜, 7:积分总榜, 8.神殿争霸, 9.全服首杀(世界领主), 10.全服首杀(领主之家)
	TIANJIAOBANGLIST: DOMAIN + '/api/activity/list',
	// 神殿争霸
	SHENDIANZHENGBA: DOMAIN + '/api/activity/temple',
	// 全服首杀 8，世界领主；9：领主之家
	QUANFUSHOUSHA: DOMAIN + '/api/activity/shousha',
	// 推广榜列表
	PROMOTIN: DOMAIN + '/api/activity/promotion',
	// 商店 礼盒商店 盲盒商店 1.礼盒；2.盲盒
	STORELIST: DOMAIN + '/api/store/list',
	// 礼盒 盲盒购买 blind_box_id
	STOREBUY: DOMAIN + '/api/store/buy',
	// 商店已获得接口数据 type  1.礼盒；2.盲盒
	OBTAINEDLIST: DOMAIN + '/api/store/obtained_list',
	//  商店 礼盒领取 盲盒开盒 POST blind_box_log_id
	STORECOLLECT: DOMAIN + '/api/store/collect',
	// 我的家族列表 1直推，2.间推 type  1.仅注册;2.有效好友3.仙王好友,4.vip好友
	FAMILYLIST: DOMAIN + '/api/family/list',
	//家族晋级
	PROMOTECOLLECT: DOMAIN + '/api/family/promote_collect',
	//绑定实名认证 true_name  id_card post
	BINDIDCRAD: DOMAIN + '/api/user/bind_id_card',
	// 家族晋级列表
	PROMOTELIST: DOMAIN + '/api/family/promote_list',
	// 家族活跃度列表
	ACTIVELIST: DOMAIN + '/api/family/active_list',
	// 家族活跃度领取
	ACTIVECOLLECT: DOMAIN + '/api/family/active_collect',
	// 上传头像 POST
	CHANGEAVATAR: DOMAIN + '/api/user/avatar',
	// 用户信息修改-qq/微信/昵称 POST nick_name qq wechat
	USEREDIT: DOMAIN + '/api/user/edit',
	// 获取用户游戏信息列表
	USERGAMEINFO: DOMAIN + '/api/user/user_game_info',
	// 绑定游戏信息
	BINDGAME: DOMAIN + '/api/user/bind_game',
	// 获取游戏账号和密码
	GAMEINFO: DOMAIN + '/api/game/info',
	// 灵石记录
	STONELIST: DOMAIN + '/api/stone/list',
	// 家族活跃度记录
	ACTIVERECORD: DOMAIN + '/api/family/active_record',
	// 大奖公示 各零钱人数
	GELINGQIANRENSHU: DOMAIN + '/api/wallet/vip_statistic',
	// 大奖公示 获奖记录
	GETHUODEJILU: DOMAIN + '/api/wallet/vip_record',
	// 当前自己活跃度和累计活跃度 get
	SELFACTIVE: DOMAIN + '/api/family/self_active',
	// 活跃度兑换零钱 post
	ACTIVERECEIVE: DOMAIN + '/api/family/active_receive',
	// 我的邀请人
	MYINVITEINFO: DOMAIN + '/api/user/invite_info',
	//直推好友搜索
	ZHITUISEARCH: DOMAIN + '/api/user/search',
	// 天下三分
	TIANXIASANFEN: DOMAIN + '/api/activity/sanfen',
	// 天神榜
	TIANXIASANFENLIST: DOMAIN + '/api/activity/list',
}

// 判断用户是否登录或者登录是否有效
function checkLogin() {
	var token = getCookie("token");
	if (!token) location.href = LOGIN_PAGE;
}

/**
 * 设置cookie
 * @param {String} key 键名
 * @param {String} value 键值
 * @param {Number} expire 有效期(秒)
 */
function setCookie(key, value, expire = 0) {
	var now = new Date();
	var nt = now.getTime();
	var ep = new Date(nt + expire * 1000);
	// 编码兼容中文
	value = encodeURIComponent(value);
	document.cookie = key + "=" + value + "; path=/; expires=" + ep;
}
/**
 * 读取cookie
 * @param {String} key 键名
 */
function getCookie(key) {
	var arr1 = document.cookie.split("; ");
	for (var i = 0; i < arr1.length; i++) {
		var arr2 = arr1[i].split("=");
		if (arr2[0] == key) {
			return decodeURIComponent(arr2[1]);
		}
	}
	return '';
}
/**
 * [removeCookie 移除cookie]
 */
function removeCookie(key) {
	setCookie(key, "", -1); // 把cookie设置为过期
	localStorage.removeItem(key);
}
//清除所有cookie函数
function clearAllCookie() {
	var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
	if (keys) {
		for (let i = 0; i < keys.length; i++) {
			setCookie(keys[i], '', -1);
		}
	}
}


/**
 * @description 显示一个提示
 * @param {String} str 提示文字
 * @param {Number} n 显示时长
 * @param {Number} f 动画帧率
 */
function openTips(str, n = 2000, f = 25) {
	let t = new Date();
	let d = document.createElement("div");
	d.className = "tips";
	d.innerHTML = "<span>" + str + "</span>";
	document.body.appendChild(d);
	setTimeout(() => {
		let o = 0.95;
		let s = setInterval(() => {
			o -= 0.05;
			if (o < 0) {
				clearInterval(s);
				document.body.removeChild(d);
			} else {
				d.style.opacity = o;
			}
		}, f);
	}, n);
}

// 复制文本内容
function copy(str) {
	var oInput = document.createElement("input");
	oInput.readOnly = 'readonly';
	oInput.value = str;
	document.body.appendChild(oInput);
	oInput.select(); // 选择对象
	var ec = document.execCommand("Copy"); // 执行浏览器复制命令
	oInput.style.display = "none";
	return ec;
}

/**
 * 获取用户信息
 * @param {Function} cb 回调函数
 */
function getUserInfo(cb) {
	let token = getCookie("token");
	let userid = getCookie("userid");
	if (!token) {
		openTips("暂未登录，请先登录");
		setTimeout(function () {
			location.replace(LOGIN_PAGE);
		}, 1000);
		return false;
	}
	ajax({
		method: 'GET',
		url: API_PATH.USER_INFO,
		header: {
			Authorization: token
		},
		success: (res) => {
			// console.log(res);return;
			if (res.code != 1) {
				openTips("登录失效，请重新登录");
				setTimeout(function () {
					location.replace(LOGIN_PAGE);
				}, 1000);
				return;
			}
			// 存储必要的用户信息
			setInfo(res.data);
			// debugger
			cb && cb(res.data);
		},
		error: err => {
			// alert(err.status);
		}
	});

	function setInfo(data) {
		var dt = 365 * 24 * 60 * 60;
		setCookie("userid", data.id, dt);
		setCookie("mobile", data.mobile, dt);//游戏账号
		setCookie("passward", data.source_password, dt);//游戏密码
		setCookie("nickname", data.nickname, dt);

		setCookie("is_check", data.is_check, dt);//是否实名认证
		setCookie("server_name", data.server_name, dt);//是否绑定游戏区服
		setCookie("game_level", data.game_level, dt);//游戏等级
		setCookie("is_vip", data.is_vip, dt);//是否为VIP
		setCookie("stone", data.stone, dt);//灵石数量
		setCookie("family_level", data.family_level, dt);//家族等级
		setCookie("server_id", data.server_id, dt);//绑定的游戏id

		setCookie("money", data.user_money, dt);//钱包金额
		setCookie("invite_code", data.invite_code, dt);
		setCookie("alipay_name", data.alipay_name, dt);
		setCookie("alipay_account", data.alipay_account, dt);
		setCookie("red_envelope", data.red_envelope, dt);//红包金额
		setCookie("recharge_total", data.recharge_total, dt);//累计充值金额
	}
}

function goBack() {
	history.back();
}

function navgateTo(str) {
	if (str) location.href = str;
}

// 存储数据到localStorage 支持对象存储
function setItem(k, v) {
	localStorage.setItem(k, JSON.stringify(v));
}
// 读取local storage 数据
function getItem(k) {
	return JSON.parse(localStorage.getItem(k));
}

/**
 * @description  HTML元素节点选择器
 * @author kevinE kevin-e-e#foxmail
 * @version v2.0 2022-2-9 10:51:30
 * @param {String} str 需要选择的标签，类，ID名称
 * @return {HTMLElement, NodeList} 选中的元素或元素数组
 */
function $(str) {
	let arr = str.split(' ');
	if (arr.length == 1) {
		return getElement(str);
	} else {
		// 符合条件的最终元素
		let rs = [];
		// 所有层级选择元素
		let as = [];
		for (let i = arr.length - 1; i >= 0; i--) {
			as.push(getElement(arr[i]));
		}

		// 判断 高层级元素 是否是 低层级元素 的父元素
		for (let i = as.length - 1; i > 0; i--) {
			// 低层级元素
			let cs = as[i - 1];
			// 高层级元素
			let ps = as[i].localName == 'object' ? as[i] : [as[i]];
			rs = getMate(cs, ps);
		}
		return rs;

		/**
		 * @description 获取 父子元素匹配 的 子元素
		 * @param {NodeList} childs 子节点数组
		 * @param {NodeList} parents 父节点数组
		 * @return {NodeList} 匹配的子元素数组
		 */
		function getMate(childs, parents) {
			let arr = [];
			for (let i = 0; i < childs.length; i++) {
				for (let j = 0; j < parents.length; j++) {
					if (isChild(childs[i], parents[j]))
						arr.push(childs[i]);
				}

			}
			return arr;
		}
	}

	/**
	 * @description 判断 元素 是否是 目标元素 子节点
	 * @param {HTMLElement} node
	 * @param {HTMLElement} target
	 */
	function isChild(node, target) {
		let result = false;
		let nps = getParentNodes(node);
		return nps.includes(target);
	}

	/**
	 * @description 获取元素所有父节点
	 * @param {HTMLElement} node
	 * @return {NodeList} 元素所有父节点
	 */
	function getParentNodes(node) {
		let arr = [];
		getParent(node);

		function getParent(node) {
			let pn = node.parentNode;
			if (pn != document.body) {
				arr.push(pn);
				return getParent(pn);
			} else arr.push(pn);
		}
		return arr;
	}

	// 获取单项元素节点
	function getElement(str) {
		function getByTage(str) {
			return document.getElementsByTagName(str);
		}

		function getByClass(str) {
			return document.getElementsByClassName(str);
		}

		function getById(str) {
			return document.getElementById(str);
		}
		let tar = /[#\.]/.test(str) ? str.substr(1) : str;
		if (str.indexOf('.') === 0) return getByClass(tar);
		else if (str.indexOf('#') === 0) return getById(tar);
		else return getByTage(tar);
	}
}


// 2021-5-19 kevin 获取设备类型
function getClientType() {
	let ua = navigator.userAgent.toLowerCase();
	if (ua.indexOf("iphone") > 0 || ua.indexOf("ipad") > 0) {
		// return "iphone";
		return "ios";
	} else if (ua.indexOf("android") > 0) {
		return "android";
	} else if (ua.indexOf("windows") > 0) {
		return "windows";
	} else {
		return "other";
	}
}

// 获取URL参数 2021-5-20
function getUrlParam(name) {
	var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
	var r = window.location.search.substr(1).match(reg); //匹配目标参数
	if (r != null) return unescape(r[2]);
	return null; //返回参数值
}

/**
 * 获取JSON配置文件
 * by kevinE 2021-9-25 15:04:18
 * @param {URL} url 请求文件地址
 * @param {Function} cb 成功回调
 * @return {JSON} json json对象
 */
async function getConfig(url, cb) {
	const res = await fetch(url);
	const json = await res.json();
	cb && cb(json);
	return json;
}


/**
 * @description 获取游戏专属链接
 * @param {Number} uid 用户ID
 * @param {Number} gid 游戏ID
 * @param {Function} cb 获取成功回调函数
 */

function getGameLink(uid, gid, token, mobile, cb) {
	// console.log(getCookie('token'));
	ajax({
		url: API_PATH.GET_GAME_LINK,
		data: {
			id: uid,
			gid: GAME_ID,
			token: getCookie('token'),
			mobile: getCookie('mobile')
		},
		success: res => {
			// console.log(res);
			if (res.code == 1) {
				cb && cb(res.data);
			}
		}
	});
}

setStatusBar();
function setStatusBar() {
	document.addEventListener('plusready', function () {
		// 返回键逻辑
		var webview = plus.webview.currentWebview();
		plus.navigator.setStatusBarBackground('#08001C');
		plus.navigator.setStatusBarStyle('light');
		var first = null;
		var list = ['home', 'equipment', 'downloadGame', 'self', 'pro-reward'];
		plus.key.addEventListener('backbutton', function () {
			webview.canBack(function (e) {
				if (~location.pathname.indexOf('home') || ~location.pathname.indexOf('bonus') || ~location.pathname.indexOf('risk') || ~location.pathname.indexOf('gift') || ~location.pathname.indexOf('self')) {
					// console.log(first);
					if (!first) {
						first = new Date().getTime();
						plus.nativeUI.toast('再按一次退出应用', {
							verticalAlign: 'bottom'
						});
						setTimeout(function () {
							first = null
						}, 1000);
					} else {
						if (new Date().getTime() - first < 1500) {
							plus.runtime.quit()
						}
					}
				}
				else webview.back();
			});
		});
	});
}

/**
 * 数字对象拓展 数字缩短长度
 * @author kevinE kevin-e-e@foxmail.com
 * @version v1.0 2021-11-5 09:33:25
 * @param {Number} prec 保留小数位
 * @param {Number} type 显示模式 1中文,2英文
 */
Number.prototype.format = function (type = 1) {
	let prec = 2;
	let _this = parseFloat(this);
	if (_this > 1e8) {
		if (type === 1) {
			if (_this > 1e10) {
				return (_this / 1e8).toFixed(1) + '亿';
			} else return (_this / 1e8).toFixed(prec) + '亿';
		} else return (_this / 1e8).toFixed(prec) + 'E';
	}
	if (_this > 1e4) {
		if (type === 1) {
			if (_this > 1e6) return (_this / 1e4).toFixed(1) + '万';
			else return (_this / 1e4).toFixed(prec) + '万';
		} else return (_this / 1e4).toFixed(prec) + 'W';
	} else return parseFloat(_this).toFixed(prec);
}

/**
 * 日期对象拓展 日期格式化
 * @author kevinE kevin-e-e@foxmail.com
 * @version v1.0 2021-9-25 14:39:43
 * @param {String} format 格式字符串，支持大写字母Y M D H I S C，其他字符原样输出
 * @param {String} date [日期字符]，默认使用当前时间
 */
Date.prototype.format = function (format, date) {
	const fm = ['Y', 'M', 'D', 'H', 'I', 'S', 'C'];
	let Y, M, D, H, I, S, C, d, str = '';
	if (date) d = new Date(date);
	else d = new Date();
	let _Y = d.getFullYear();
	let _M = d.getMonth() + 1;
	_M = _M < 10 ? '0' + _M : _M;
	let _D = d.getDate();
	_D = _D < 10 ? '0' + _D : _D;
	let _H = d.getHours();
	_H = _H < 10 ? '0' + _H : _H;
	let _I = d.getMinutes();
	_I = _I < 10 ? '0' + _I : _I;
	let _S = d.getSeconds();
	_S = _S < 10 ? '0' + _S : _S;
	let _C = d.getMilliseconds();
	_C = _C < 100 ? _C < 10 ? '00' + _C : '0' + _C : _C;
	for (var i = 0; i < format.length; i++) {
		let fi = format[i];
		if (fm.indexOf(fi) >= 0) str += eval('_' + fi);
		else str += format[i];
	}
	return str;
}

/**
 * 对象数组拓展 数组按指定属性键值排序
 * @author kevinE kevin-e-e@foxmail.com
 * @version v1.0 2022-2-27 15:20:09
 * @param {String} key 指定的属性键名
 */
Array.prototype.keySort = function (key) {
	let that = this;
	for (let i = 0; i < that.length - 1; i++) {
		for (let j = 0; j < that.length - 1; j++) {
			if (parseFloat(that[j][key]) > parseFloat(that[j + 1][key])) {
				let temp = that[j];
				that[j] = that[j + 1];
				that[j + 1] = temp;
			}
		}
	}
	return this;
}

/**
 * 对象数组拓展 数组按指定属性键值排序
 * @author kevinE kevin-e-e@foxmail.com
 * @version v1.0 2022-3-2 11:49:27
 * @param {String} key 指定的属性键名
 * @param {String} val 指定的属性值
 */
Array.prototype.given = function (key, val) {
	let obj = null;
	let that = this;
	for (let i = 0; i < that.length; i++) {
		if (that[i][key] == val) return that[i];
	}
	return obj;
}

/**
 * 发送ajax请求
 * @author kevinE kevin-e-e@foxmail.com
 * @version v1.0 2021-9-25 15:00:30
 * @param {JSON} cfg xhr配置
 * @param {URLString} cfg.url 请求路径
 * @param {String} cfg.method 请求方式[GET, POST]
 * @param {JSON} cfg.header 请求头
 * @param {JSON} cfg.data 请求参数
 * @param {Function} cfg.success 成功回调
 * @param {Boolean} cfg.isAsync 是否异步
 * @param {Function} cfg.error 错误回调
 */
function ajax({
	url,
	method = 'GET',
	header,
	data,
	success = null,
	isAsync = true,
	error = null
}) {
	ver = getCookie('xhr.ver') || new Date().format('MDHIS');
	let _data = '';
	for (let k in data) {
		_data += '&' + k + '=' + data[k];
	}
	let xhr = new XMLHttpRequest();
	if (method === 'GET' || method == 'get')
		url = url + '?v=' + ver + _data;
	else url = url + '?v=' + ver;
	xhr.open(method, url, isAsync);
	if (method === 'POST' || method === 'post')
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	if (header) {
		for (let key in header) {
			xhr.setRequestHeader(key, header[key]);
		}
	}
	xhr.onreadystatechange = function () {
		if (xhr.readyState == 4 && xhr.status === 200) {
			let res = JSON.parse(xhr.responseText);
			success && success(res);
		} else if (xhr.readyState == 4 && xhr.status !== 200) {
			error && error(xhr);
		}
	}
	xhr.send(_data);
}

/**
 * 缓存控制器 静态HTML版本管理 不能真正清除缓存文件
 * 工作原理是通过控制版本号 绕过缓存机制实现强制刷新页面
 * @author kevinE kevin-e-e@foxmail.com
 * @version v1.0 2021-9-25 14:43:41
 * @example 在需要做版本控制的页面执行该函数 使用cleanCache函数清除缓存更新版本
 */
function ctrlCache() {
	// 缓存版本键名
	let vk = PREFIX + '-ver';
	// 缓存版本[数字]
	let vv = getItem(vk) || new Date().format('YMDHIS');
	// 缓存文件键名
	let ck = PREFIX + '-cache-' + vv;
	// 缓存文件[数组]
	let cf = getItem(ck) || [];
	// 当前页面路径
	let hf = location.origin + location.pathname;
	// 当前页面不在缓存中
	if (cf.indexOf(hf) < 0) {
		// 将当前路径存入缓存
		// console.log(hf)
		cf.push(hf);
		// 添加版本号后重新加载
		let _hf = hf + '?v=' + vv;
		// 存储缓存版本
		setItem(vk, vv);
		// 存储缓存文件名
		setItem(ck, cf);
		location.replace(_hf);
		return false;
	}
}
// 清空缓存[强制刷新]
function cleanCache() {
	// 缓存版本键名
	let vk = PREFIX + '-ver';
	// 获取已有版本信息
	let _vv = getItem(vk);
	// 缓存文件键名
	let ck = PREFIX + '-cache-' + _vv;
	// 清除已有缓存文件
	localStorage.removeItem(ck);
	// 缓存新版本号
	let vv = new Date().format('YMDHIS');
	// 存储新的缓存版本
	setItem(vk, vv);
	// 查询最新版本 判断是否更新成功
	let nv = getItem(vk);
	// 返回操作结果
	return vv == nv;
}




// 数字滚动实现
function countto(startNum, endNum, obj) {
	var step = (endNum - startNum) / 20;//颗粒化可以控制速度
	var count = startNum;
	var timer = setInterval(() => {
		count = count + step;
		if (count >= endNum) {
			clearInterval(timer);
			count = endNum;
		}
		obj.innerHTML = Number(count).toFixed(2)
	}, 30);
}
